package com.unit2;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author Siaze
 * @description 输入一些数值，求出现次数最多的数。如果有多个并列，则从大到小输出。
 * @date 2021/11/2
 */
public class One {
    private static class Compare {
        private int value;
        private int count;

        Compare(int value) {
            this.value = value;
            this.count = 1;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }

        public int getCount() {
            return count;
        }

        public void setCount(int count) {
            this.count = count;
        }

        public boolean equalValue(int value) {
            if (this.value == value) {
                count++;
                return true;
            }
            return false;
        }

        @Override
        public String toString() {
            return "Compare{" +
                    "value=" + value +
                    ", count=" + count +
                    '}';
        }
    }

    private static List<Compare> nums = new ArrayList<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入非数字结束循环!");
        while (sc.hasNextInt()) {
            compute(sc.nextInt());
        }
        System.out.println(getResult());
    }

    /**
     * 判断value是否已经存在，若不存在则新建Compare对象，反之相应的count自增
     * @param value 需要判断的value
     */
    public static void compute(int value) {
        for (int i = 0; i < nums.size(); i++) {
            if (nums.get(i).equalValue(value)) {
                return;
            }
        }
        nums.add(new Compare(value));
    }

    /**
     * 将输入的Compare对象通过count排序
     */
    public static void sortByCount() {
        nums.sort((a, b) -> {
            return b.getCount() - a.getCount();
        });
    }

    /**
     * 通过count排序后，遍历数组，先将首个Compare对象添加到list数组，并判断该Compare对象与数组下一个对象的count是否相等
     * 若相等则将Compare对象添加到返回的数组列表中，并进行下一轮循环，反之，break跳出。
     * 最后list通过value从大到小排序，返回list。
     * @return
     */
    public static List<Compare> getResult() {
        sortByCount();
        List<Compare> list = new ArrayList<>();
        for (int i = 0; i < nums.size() - 1; i++) {
            list.add(nums.get(i));
            if (nums.get(i).getCount() != nums.get(i + 1).getCount()) {
                break;
            }
        }
        nums.sort((a, b) -> {
            return b.getValue() - a.getValue();
        });
        return list;
    }
}
